Developers often build complex software applications that incorporate external code or libraries. For example, a developer may want to include a list of people in his application. Instead of defining his own list object, the developer may include a list class from an external package. In this example as shown in FIG. 1, the developer may include a list from a standard library in his code, such as “java.util.List.” The “java.util.List” is a class of ordered collection that is publically available through the java.util package. Once the list has been imported into a developer's source code file, the developer may simply refer to the list with the simple name, “List,” without having to use the full, qualified name “java.util.List” everywhere a list is instantiated or used. For example, on line 3 of FIG. 1, the code refers only to the simple name, “List,” and not the qualified name, “java.util.List.”
Although the process to import packages, libraries, or external code that defines the qualified names into a source code can be straightforward for small code bases using standard integrated development environments (IDEs), large-scale code bases have too many external dependencies for standard IDEs to efficiently find the appropriate full names, referred to as qualified names, or the appropriate build system constructs for the dependencies.
Conventional systems attempt to find qualified names in real-time by looking at the entire code base and trying to determine the appropriate package, library, or other external code. This process is time-consuming. Large amounts of source code simply cannot be processed in a reasonable time using this approach.
As recognized by the inventor, there should be a way to quickly find candidates of qualified names in order to import the appropriate package, library, or external code for simple name references that exist in source code and the build-system dependencies that provide the qualified names.